import pandas as pd
import numpy as np
from sklearn import svm
# from sklearn import cross_validation
from sklearn import model_selection

data = pd.read_csv('stock/000777.csv', encoding='gbk', parse_dates=[0], index_col=0)
# 按照时间升序排列
data.sort_index(0, ascending=True, inplace=True)

# 选取150天的数据
dayfeature = 150
# 选取5个特征
featurenum = 5 * dayfeature
# 记录150天的5个特征
x = np.zeros((data.shape[0] - dayfeature, featurenum + 1))
# 记录涨或者跌
y = np.zeros((data.shape[0] - dayfeature))
# data.shape[0]-dayfeature 用150天数据做训练，
# 对于条目为200条的数据，只有50条数据是有前150天的数据来训练的，
# 所以训练集的大小就是200-150，
# 对于每一条数据，他的特征是前150天的所有特征数据，即150*5，
# +1是将当天的开盘价引入作为一条特征数据。

for i in range(0, data.shape[0] - dayfeature):
    x[i, 0:featurenum] = np.array(data[i:i + dayfeature]\
                                      [[u'收盘价', u'最高价', u'最低价', u'开盘价', u'成交量']]).reshape((1, featurenum))
    x[i, featurenum] = data.ix[i + dayfeature][u'开盘价']

for i in range(0, data.shape[0] - dayfeature):
    if data.ix[i + dayfeature][u'收盘价'] >= data.ix[i + dayfeature][u'开盘价']:
        y[i] = 1
    else:
        y[i] = 0

clf = svm.SVC(kernel='rbf')
result = []
for i in range(5):
    x_train, x_test, y_train, y_test = \
        model_selection.train_test_split(x, y, test_size=0.2)
    # cross_validation.train_test_split(x, y, test_size=0.2)
    clf.fit(x_train, y_train)
    result.append(np.mean(y_test == clf.predict(x_test)))
print("svm classifier accuacy:")
print(result)
# 交叉验证法
# 先将数据集D划分为k个大小相似的互斥子集，
# 每个子集都尽可能保持数据分布的一致性，即从D中通过分层采样得到。
# 然后，每次用k-1个子集的并集作为训练集，余下的那个子集作为测试集；
# 这样就可获得k组训练/测试集，从而可进行k次训练和测试，
# 最终返回的是这个k个测试结果的均值。
# 通常把交叉验证法称为“k者交叉验证”,
# k最常用的取值是10，此时称为10折交叉验证。
